﻿#define _CRT_SECURE_NO_WARNINGS 1


////拷贝一个文件
//#include<stdio.h>
//
//int main()
//{
//	FILE* pfin = fopen("data.txt", "r");
//	if (pfin == NULL)
//	{
//		perror("pfin fopen");
//		return;
//	}
//
//	FILE* pfout = fopen("data_copy.txt", "w");
//	if (pfout == NULL)
//	{
//		fclose(pfin);
//		perror("pfout fopen");
//		return;
//	}
//	//读写
//	char ch = 0;
//	while ((ch = fgetc(pfin)) != EOF)
//	{
//		fputc(ch,pfout);
//	}
//
//	//关闭文件
//	fclose(pfin);
//	fclose(pfout);
//	pfin = pfout = NULL;
//
//	return 0;
//}


//#define宏定义
//#define机制包括了⼀个规定，允许把参数替换到⽂本中，这种实现通常称为宏（macro）或定义宏（define macro）

//#include<stdio.h>
//#include<stdlib.h>
//
//#define SQUARE(X)  (X)*(X)
//
//#define DOUBLE(X)  ((X)+(X))
//
//#define MAX(A,B) ((A) > (B) ? (A):(B))
//
//#define MALLOC(num,type)  (type*)malloc(num*sizeof(type))
//
//
//int main()
//{
//	int ret = SQUARE(5);
//	printf("%d\n", ret);
//
//	int ret1 = 10*DOUBLE(5);
//	printf("%d\n", ret1);
//
//	int ret2 = MAX(3, 7);
//	printf("%d\n", ret2);
//
//	int* p_int = MALLOC(10, int);
//	if (p_int == NULL)
//	{
//		perror("malloc");
//		return;
//	}
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		*(p_int + i) = i + 1;
//		printf("%d ", *(p_int + i));
//	}
//	printf("\n");
//
//
//	return 0;
//}


//#运算符 --- 将宏的⼀个参数转换为字符串字⾯量
//#include<stdio.h>
//
//
//#define PRINT(n, format)  printf("The value of "#n" is " format "\n",n)
// 
//int main()
//{
//	int a = 5;
//	int b = 10;
//	float f = 5.7f;
//
//	PRINT(a, "%d");
//	PRINT(b, "%d");
//	PRINT(f, "%f");
//
//	return 0;
//}


//## 运算符 --- 可以把位于它两边的符号合成⼀个符号，它允许宏定义从分离的⽂本⽚段创建标识符。 ## 被称为记号粘合

#include<stdio.h>

#define GENERIC_MAX(type)						\
		type type##_max(type x,type y)		    \
		{										\
			return ((x) > (y) ? (x) : (y));		\
		}

//定义函数
GENERIC_MAX(int);
GENERIC_MAX(float);

int main()
{
	int ret1 = int_max(5, 7);
	printf("%d\n", ret1);

	float ret2 = float_max(3.3, 7.7);
	printf("%f\n", ret2);

	return 0;
}


//#undef --- 这条指令⽤于移除⼀个宏定义。


//条件编译
//#if 常量表达式
// //...
//#endif


//多个分⽀的条件编译
//#if 常量表达式
////...
//#elif 常量表达式
////...
//#else
////...
//#endif




